package baduga.karo;

//klasa z pierwszym ekranem gracza - listą stołów

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

import baduga.client.Controler;
import baduga.client.Player_Constans;
import baduga.core.Core_Gui_ErrorWindow;
import baduga.core.Core_JsonDataSchema;
import baduga.core.Core_Messages;
import baduga.core.Core_TableModel;
import baduga.server.Game_Cfg;

import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout;
import javax.swing.LayoutStyle.ComponentPlacement;

/**
  * @author Karolina
 */
public class TableListScreen extends javax.swing.JFrame {

  
    private JButton jButtonDownExit;
    private JButton jButtonJoinGame;
    private JButton jButtonNewTable;
    private JLabel jLabelTittle;
    private JMenuBar jMenuBar1;
    private JMenu jMenuFIile;
    private JMenu jMenuGame;
    private JMenu jMenuHelp;
    private JMenuItem jMenuItemAbout;
    private JMenuItem jMenuItemExit;
    private JMenuItem jMenuItemHelp;
    private JMenuItem jMenuItemNewTable;
    private JScrollPane jScrollPane1;
    private JTable jTables;
    
    private Core_TableModel jTableModel;
	
	
	
	private static final long serialVersionUID = 1L;
	private Controler contr;
	private JButton btnRefresh;
	
	
	
	
	
	public TableListScreen() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(TableListScreen.class.getResource("/baduga/karo/resources/icon.png")));
        initComponents();
    }

	
	
	public TableListScreen(Controler newVar) {
		
		this.contr = newVar;
		
		

		
		setIconImage(Toolkit.getDefaultToolkit().getImage(TableListScreen.class.getResource("/baduga/karo/resources/icon.png")));
        initComponents();
        
        
    }
	
	
    @SuppressWarnings("unchecked")
                              
    private void initComponents() {

    	//dodajemy podstawowe pola na oknie
    	
        jButtonJoinGame = new JButton();
        jButtonNewTable = new JButton();
        jButtonDownExit = new JButton();
        jLabelTittle = new JLabel();
        jScrollPane1 = new JScrollPane();
        jTables = new JTable();
        jMenuBar1 = new JMenuBar();
        jMenuFIile = new JMenu();
        jMenuItemExit = new JMenuItem();
        jMenuGame = new JMenu();
        jMenuItemNewTable = new JMenuItem();
        jMenuHelp = new JMenu();
        jMenuItemHelp = new JMenuItem();
        jMenuItemAbout = new JMenuItem();

        //po wciśnięciu X okienko zamyka się, ustalamy tytuł
        
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Badugi - Lista stołów");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
            //    windowOpened(evt);
            }
        });

        //dodajemy akcję to danego przycisku
        
        
        btnRefresh = new JButton("Odśwież");
        
        btnRefresh.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                jButtonRefreshMouseClicked(evt);
            }
        });
        
        
        
        jButtonJoinGame.setText("Dołącz");
        jButtonJoinGame.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonJoinGameMouseClicked(evt);
            }
        });

        jButtonNewTable.setText("Nowy stół");
        jButtonNewTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonNewTableMouseClicked(evt);
            }
        });

        jButtonDownExit.setText("Wyjście");
        jButtonDownExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonDownExitActionPerformed(evt);
            }
        });
        
        
        jLabelTittle.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabelTittle.setText("Badugi - lista stołów");

      
        //pobieramy listę stołów oraz graczy i wyświetlamy ją w tabeli
        
        /* w zmiennej numberOfTables przechowujemy ilość stołów
         * następnie tablica numberOfPlayers mówi nam ilu graczy jest na danym stole (podmieniamy ich nicki, reszta zostaje jako "-"
         * następnie tablica playersNames mówi nam o tym jakie nicki mają gracze na danym stole (nr indeksu = nr stołu))
         * w pierwszej pętli for do tablesList podstawiamy wszędzie myślniki
         * a w drugiej ładnie zczytujemy od serwera nicki
         * oczywiście numberOfPlayers można zastąpić playersNames[i].length - będzie to ilość graczy na i-tym stole
         * w tablicy tablesNames mamy nazwy stołów - i-ty indeks to nazwa i-tego stołu
         */
        
        int numberOfTables = 0,
        	numofColumns = 5;
        
        int[] numberOfPlayers = new int[numberOfTables];
        String[][] playersNames = new String[numberOfTables][numofColumns];
        String[] tablesNames = new String[numberOfTables];
        Object[][] tablesList = new Object[numberOfTables][numofColumns];
        
       for(int i = 0; i<numberOfTables; i++){
    	   for(int j = 0; j <numofColumns; j++ ){
    		   tablesList[i][j] = "-----------";
    	   }
       }
        
        for(int i = 0; i < numberOfTables; i++){
        	for(int j = 0; j+1< numberOfPlayers[i]; j++){
        		tablesList[i][0] = tablesNames[i];
        		tablesList[i][j+1] = playersNames[i][j];
        	}
        }
        
        
        
        //Ustawienie Tabeli
        initTable();
        

        
        
        
        
        
            

        
         //obsługa menu i jego pozycji
        
        jMenuFIile.setText("Plik");

        jMenuItemExit.setText("Zakończ");
        jMenuItemExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemExitActionPerformed(evt);
            }
        });
        jMenuFIile.add(jMenuItemExit);

        jMenuBar1.add(jMenuFIile);

        jMenuGame.setText("Gra");

        jMenuItemNewTable.setText("Nowy stół"); 
        jMenuItemNewTable.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemNewTableActionPerformed(evt);
            }
        });
        
        jMenuGame.add(jMenuItemNewTable);

        jMenuBar1.add(jMenuGame);

        jMenuHelp.setText("Pomoc");

        jMenuItemHelp.setText("Help");
        jMenuItemHelp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemHelpActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemHelp);

        jMenuItemAbout.setText("About");
        jMenuItemAbout.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemAboutActionPerformed(evt);
            }
        });
        jMenuHelp.add(jMenuItemAbout);

        jMenuBar1.add(jMenuHelp);

        setJMenuBar(jMenuBar1);
        

        //podstawowe parametry okna
        
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        layout.setHorizontalGroup(
        	layout.createParallelGroup(Alignment.LEADING)
        		.addGroup(layout.createSequentialGroup()
        			.addGap(218)
        			.addComponent(jButtonJoinGame, GroupLayout.PREFERRED_SIZE, 81, GroupLayout.PREFERRED_SIZE)
        			.addGap(27)
        			.addComponent(jButtonNewTable)
        			.addGap(26)
        			.addComponent(jButtonDownExit)
        			.addContainerGap(399, Short.MAX_VALUE))
        		.addGroup(layout.createSequentialGroup()
        			.addContainerGap()
        			.addComponent(jLabelTittle, GroupLayout.PREFERRED_SIZE, 448, GroupLayout.PREFERRED_SIZE)
        			.addPreferredGap(ComponentPlacement.RELATED, 349, Short.MAX_VALUE)
        			.addComponent(btnRefresh)
        			.addGap(31))
        		.addGroup(layout.createSequentialGroup()
        			.addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 901, Short.MAX_VALUE)
        			.addContainerGap())
        );
        layout.setVerticalGroup(
        	layout.createParallelGroup(Alignment.LEADING)
        		.addGroup(layout.createSequentialGroup()
        			.addContainerGap()
        			.addGroup(layout.createParallelGroup(Alignment.BASELINE)
        				.addComponent(jLabelTittle, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
        				.addComponent(btnRefresh))
        			.addPreferredGap(ComponentPlacement.RELATED)
        			.addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, 293, GroupLayout.PREFERRED_SIZE)
        			.addGap(22)
        			.addGroup(layout.createParallelGroup(Alignment.BASELINE)
        				.addComponent(jButtonJoinGame)
        				.addComponent(jButtonNewTable)
        				.addComponent(jButtonDownExit))
        			.addContainerGap(23, Short.MAX_VALUE))
        );
        getContentPane().setLayout(layout);

        pack();
    }
    
    	//obsluga przycisku wyjscie
    private void jButtonDownExitActionPerformed(java.awt.event.ActionEvent evt) {
    	
    	Controler.guiExScr= new ExitScreen(contr);
 
    	//Init
    	Controler.guiExScr.setVisible(true);
    	Controler.guiExScr.setLocationRelativeTo(null);
    }                                               

   

    //obsluga przycisku nowy stol
    private void jButtonNewTableMouseClicked(java.awt.event.MouseEvent evt) {                                             
        

    	
    	if(Player_Constans.getCash() >= Game_Cfg.VALUE_BIG_BLIND[0])
    	{
    		
    		Controler.guiCrNewTab = new CreateNewTable(contr);

    		Controler.guiCrNewTab.setVisible(true);
    		Controler.guiCrNewTab.setLocationRelativeTo(null);
    		
    		
	        this.setVisible(false); 
    	}
    	else
    	{
    		Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(0x01F8) + Integer.toString(Game_Cfg.VALUE_BIG_BLIND[0]), Core_Messages.getMessage(0x0100));
    	}
    }     
    
    
    /**
     * Dołączanie do gry
     * 
     * @param evt
     */
    private void jButtonJoinGameMouseClicked(java.awt.event.MouseEvent evt) {                                             

    	
    	//Zabezpiecza przed null pointerem, gdy nie ma wczytanych danych
    	if(jTableModel.getRowCount() > 0)
    	{
	    	final String tableID = jTableModel.getTableID( jTables.getSelectedRow() );
	    	
	    	
	    	if(!contr.fSendData(joinTableDataToJson(tableID)))
	    	{
	    		Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(0x02F3), Core_Messages.getMessage(0x0100));
	    	}
	    	
    	}
    	else
    	{
    		Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(0x01F6), Core_Messages.getMessage(0x0100));
    	}
            
    }                                            
// obsluga przycisku wyjdz w menu
    private void jMenuItemExitActionPerformed(java.awt.event.ActionEvent evt) {                                              
        final ExitScreen question = new ExitScreen(contr);
            question.setVisible(true);
            question.setLocationRelativeTo(null);
    }                                             
//zasady gry
    private void jMenuItemHelpActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:
    }
    
    //o autorach
    private void jMenuItemAboutActionPerformed(java.awt.event.ActionEvent evt) {                                               
        final AboutAuthorsScreen about = new AboutAuthorsScreen();
            about.setVisible(true);
            about.setLocationRelativeTo(null);
    }         
    
    
    /**
     * Funkcja zajmuje sie wczytaniem nowej porcji danych do tabeli modelu
     * 
     * @param evt
     */
    private void jButtonRefreshMouseClicked(final MouseEvent inputEvt)
    {    	
    	if(!contr.fSendData( tableListDataToJson() ))
    	{
    		Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(0x02F3), Core_Messages.getMessage(0x0100));
    	}
    	
    }
    
    
    
    
    
	/**
	 * Tworzenie nowego stołu
	 * 
	 * @param evt
	 */
    private void jMenuItemNewTableActionPerformed(java.awt.event.ActionEvent evt) {    
    	
    	

    	
    	if(Player_Constans.getCash() >= Game_Cfg.VALUE_BIG_BLIND[0])
    	{
    		Controler.guiCrNewTab = new CreateNewTable(contr);

    		Controler.guiCrNewTab.setVisible(true);
    		Controler.guiCrNewTab.setLocationRelativeTo(null);
    		
    		
	        this.setVisible(false); 
    	}
    	else
    	{
    		Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(0x0101) + Integer.toString(Game_Cfg.VALUE_BIG_BLIND[0]), Core_Messages.getMessage(0x0100));
    	}
    }                                              

    

    
    /**
     * Funkcja konfiguruje własności tabeli
     */
    private final void initTable()
    {
    	
    	//Nazwy kolumn
        String[] columnNames = {"lp", "Nazwa stołu", "Min. Kwota", "Ile graczy/obserwatorów", "Status", "Działania"};
        
        //Które kolumny mpożna edytować
        boolean[] canEdit = new boolean [] {
        		false, false, false, false, false, false
	    };
        
        
        
        jTableModel = new Core_TableModel(canEdit, columnNames, true);
        
        jTables.setModel(jTableModel);
    	
    	
    	//Ograniczenie selekcji do jednego rekordu
    	this.jTables.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    	
    	
        //rozmiar kolumny tabeli z nazwa stołu wbijamy na sztywno
        jTables.getTableHeader().setReorderingAllowed(false);
        
        jScrollPane1.setViewportView(jTables);
        
        if (jTableModel.getColumnCount() > 0) {
        	
        	jTables.getColumnModel().getColumn(0).setResizable(false);
            jTables.getColumnModel().getColumn(1).setMinWidth(200);
            
            
            for(int i = 2; i < jTableModel.getColumnCount(); i++)
            {
            	jTables.getColumnModel().getColumn(i).setResizable(false);
            }

        }
    	
    	
    	
    }
    
    
    //----------------- [DateMakeForJson] - #START -------------------------
    
    /**
     * Tworzy struktutrę do JSONA
     * 
     * @return
     */
    private Core_JsonDataSchema tableListDataToJson()
    {
    	Core_JsonDataSchema data = new Core_JsonDataSchema();
    	
    	//Ustawienie kodu
    	data.setKod(0x02);
    	
    	//Ustawienie argumentów
    	data.setArgs
    	(
    		new int[] {
    			0x02
    		}
    	);
    	
    	
    	//Ustawienie danych
    	data.setDataD1
    	(
    		new Object[] {
    			50,
    			jTableModel.getPageNr()
    		}
    	);
    	
    	return data;
    	
    }
    
    
    private Core_JsonDataSchema joinTableDataToJson(final String tableId)
    {
    	Core_JsonDataSchema data = new Core_JsonDataSchema();
    	
    	//Ustawienie kodu
    	data.setKod(0x04);
    	
    	//Ustawienie argumentów
    	data.setArgs
    	(
    			new int[] {
    					0x02
    			}
    	);
    	
    	
    	//Ustawienie danych
    	data.setDataD1
    	(
    		new Object[] {
    			Player_Constans.getPlayerID(),
    			tableId
    		}
    	);
    	
    	return data;
    	
    }
    
    
  //----------------- [DateMakeForJson] - #END -------------------------

    
    /**
     * Zwraca Kontroler
     * 
     * @return
     */
    public Controler getControler()
    {
    	return contr;
    }
    
    
	/**
	 * Uzupełnia dane do nowego stołu
	 * 
	 * @param nData
	 * 
	 */
    public void setTableData(Object[] nData)
    {
    	jTableModel.setData(nData);
    }
                     

               
}
